package com.example.test_1_24_springmvctest;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class Test124SpringMvcTestApplication {

    public static void main(String[] args) {
        SpringApplication.run(Test124SpringMvcTestApplication.class, args);

        // 搞一个计算器

        // 首先还是要接口的定义:
        // 请求路径：calc/sum
        // 请求⽅式：GET/POST
        // 接⼝描述：计算两个整数相加

        // 请求参数:
        // 参数名 类型 是否必须 备注
        // num1 Integer 是 参与计算的第⼀个数
        // num2 Integer 是 参与计算的第⼆个数
        // ⽰例: num1=5&num2=3

        // 响应数据:
        // Content-Type: text/html
        // 响应内容: 计算机计算结果: 8

        // 写完后端代码
        // 最主要的是 前后端交互
        // 但是在前后端交互的过程中, 如果出现错误了, 应该如何解决
        // 如何定位问题?
        //  1. 先定位前端还是后端
        //     如何定位前端还是后端?
        //      通过日志:
        //      1) 前端: F12 看控制台日志
        //      2) 后端: 接口 看控制台日志
        //     用排除法, 先看请求是否到达后端, 如果没有到达肯定是 前端的问题
        //              简单的方法就是 打印日志, 打印日志通常在方法的第一行, 在后端里面写 System.out.println("里面随便写");
        //              这时候后端没有任何反应就说明, 前端没有到达
        //              这时候 就要按 F12, 看控制台, 如果这个控制台也没有报错, 那就看前端代码了, 看代码是否写错
        //          还有一种方法就是 抓包
        //      那就需要测试接口了, 通过 http 来测试 , 直接输入 后端代码写url路径, 如果能访问进去, 就说明还是是前端的问题
        //      如果前端确定没有错误, 那就有可能是 环境的问题了


        // 搞一个用户登录
        // 如果 登录的时候 显示的是之前写的老代码
        // 那就需要清除一下缓存
        // 后端的缓存是在  Maven 里面的 clean 里面

        // 登录的案例:
        // 有两个案例
        // 1. 登录接口
        //  请求路径：/user/login
        //  请求⽅式：POST
        //  接⼝描述：校验账号密码是否正确

        // 请求参数:
        // 参数名 类型 是否必须 备注
        // userName String 是 校验的账号
        // password String 是 校验的密码

        // 响应数据
        // Content-Type: text/html
        //  响应内容:
        //  true//账号密码验证成功
        //  false//账号密码验证失败


        // 2. 获取用户登录信息
        // 接口:
        // 请求路径：/user/getUserInfo
        // 请求⽅式：GET
        // 接⼝描述：查询当前登录的⽤⼾
        // 请求参数: 无
        // 响应数据:
        // Content-Type: text/html
        //响应内容:
        //  admin


        // 项目调试
        // 点击 Debug
        // 先打一个断点



        // 搞一个留言板
        // 提交留言
        // 接口请求: GET /message/publish
        // 参数: MessageInfo (from, to, message)
        // 返回结果: true/false

        // 查看所有留言
        // /message/getMassageList
        // 参数: 无
        // 返回结果: List<MessageInfo>

        //***** 这里面 在 MessageInfo 中有 一个插件要学习 ****


        // **** 分层思想 ****
        // 回过头来看代码, 发现还是很乱
        // 这时候要提到一个思想
        // 应用分层
        // 三层架构思想:
        // 1. 表现层   : 接收请求, 返回结果
        // 2. 业务逻辑层  : 主要处理业务逻辑
        // 3. 数据层: 处理数据,包含数据的存储, 获取(增删改查)

        // Spring 也提供了这些思想
        // Controller ---- > Service ------ > Dao ----- >DB
        // Controller : 接收请求, 参数是否合法, 结果的响应
        // Service: 真正干活的部分, 处理业务的逻辑
        // Dao: 数据的存储

        // 软件设计原则之一：⾼内聚低耦合.
        // ⾼内聚指的是：⼀个模块中各个元素之间的联系的紧密程度，如果各个元素(语句、程序段)之间的联
        // 系程度越⾼，则内聚性越⾼，即 "⾼内聚"。
        // 低耦合指的是：软件中各个层、模块之间的依赖关联程序越低越好。修改⼀处代码, 其他模块的代码
        // 改动越少越好

        // ⾼内聚低耦合⽭盾吗?
        //不⽭盾, ⾼内聚指的是⼀个模块中各个元素之间的联系的紧密程度, 低耦合指的是各个模块之间的紧密程度
        //这就好⽐⼀个企业, 包含很多部⻔, 各个部⻔之间的关联关系要尽可能的⼩, ⼀个部⻔发⽣问题, 要尽
        //可能对降低对其他部⻔的影响, 就是耦合. 但是部⻔内部员⼯关系要尽量紧密, 遇到问题⼀起解决,克服. 这叫做内聚.
        //⽐如邻⾥邻居, 楼上漏⽔, 楼下遭殃, 就是耦合. 家庭⼀个成员⽣病, 其他成员帮忙照顾, 就叫内聚.
        //⼀个家庭内部的关系越紧密越好, ⼀个家庭尽可能少的影响另⼀个家庭, 就是低耦合.

        // **** 代码重构 ****
        // 代码拆分
        // 控制层: 接收前端发送的请求，对请求进⾏处理，并响应数据
        // 业务逻辑层: 处理具体的业务逻辑。
        // 数据访问层: 负责数据访问操作，包括数据的增、删、改、查

        // 应⽤分层的好处
        //• 降低层与层之间的依赖, 结构更加的明确, 利于各层逻辑的复⽤
        //• 开发⼈员可以只关注整个结构中的其中某⼀层, 极⼤地降低了维护成本和维护时间
        //• 可以很容易的⽤新的实现来替换原有层次的实现
        //• 有利于标准化

        //  企业规范
        //1. 类名使⽤⼤驼峰⻛格，但以下情形例外：DO/BO/DTO/VO/AO
        //2. ⽅法名、参数名、成员变量、局部变量统⼀使⽤⼩驼峰⻛格
        //3. 包名统⼀使⽤⼩写，点分隔符之间有且仅有⼀个⾃然语义的英语单词.
        // ⼤驼峰: 所有单词⾸字⺟都需要⼤写, ⼜叫帕斯卡命名法, ⽐如: UserController
        // ⼩驼峰: 除了第⼀个单词，其他单词⾸字⺟⼤写,⽐如: userController
        // 蛇形: ⽤下划线(_)作⽤单词间的分隔符, ⼀般⼩写, ⼜叫下划线命名法, ⽐如: user_controller
        // 串形: ⽤短横线(-)作⽤单词间的分隔符, ⼜叫脊柱命名法, ⽐如: user-controller

        // 总结
        // 1. 学习Spring MVC, 其实就是学习各种Web开发需要⽤的到注解
        //a. @RequestMapping: 路由映射
        //b. @RequestParam: 后端参数重命名
        //c. @RequestBody: 接收JSON类型的参数
        //d. @PathVariable: 接收路径参数
        //e. @RequestPart: 上传⽂件
        //f. @ResponseBody: 返回数据
        //g. @CookieValue: 从Cookie中获取值
        //h. @SessionAttribute: 从Session中获取值
        //i. @RequestHeader: 从Header中获取值
        //j. @Controller: 定义⼀个控制器, Spring 框架启动时加载, 把这个对象交给Spring管理. 默认返回视图.
        //k. @RestController: @ResponseBody + @Controller 返回数据
        //2. Cookie 和Session都是会话机制, Cookie是客⼾端机制, Session是服务端机制. ⼆者通过SessionId
        //来关联. Spring MVC内置HttpServletRequest, HttpServletResponse两个对象. 需要使⽤时, 直接在
        //⽅法中添加对应参数即可, Cookie和Session可以从HttpServletRequest中来获取, 也可以直接使⽤
        //HttpServletResponse设置Http响应状态码.
        //3. Java EE学习阶段会涉及较多⼯具, 插件的学习, 来帮助我们提⾼开发效率. ⽐如Postman, lombok,
        //EditStarter, 后⾯还会继续学习其他的⼯具或插件


    }

}
